# Create your views here.
import json

from django.core.paginator import Paginator
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.template.response import TemplateResponse
from django.views import View

from apps.contents.models import ContentCategory
from apps.goods.models import GoodsCategory, SKU
from  utils.goods import  get_category
from  utils.goods import  get_goods_specs
#pip install django-haystack whoosh  # Whoosh 作为搜索引擎后端  pip install django-haystack whoosh -i https://mirrors.aliyun.com/pypi/simple/
#pip install elasticsearch==7.6.0 -i https://mirrors.aliyun.com/pypi/simple/
from haystack.views import SearchView
from django.forms.models import model_to_dict
"""
关于模型的分析
1. 根据页面效果 尽量多的分析字段
2. 去分析是保存在一个表中 还是多个表中 （多举例说明）

分析表的关系的时候 最多不要超过3个表

多对多（一般是 3个表）

学生 和 老师

学生表
stu_id      stu_name

100             张三
200             李四

老师表
teacher_id  teacher_name
666             牛老师
999             齐老师


第三张表

stu_id      teacher_id
100             666
100             999
200             666
200             999

商品day01    模型的分析 --》  Fdfs(用于保存图片，视频等文件) --》 为了部署Fdfs学习Docker


"""

from utils.goods import  get_breadcrumb
class IndexView(View):
      """
        首页的数据分为2部分
        1、部分是  商品分类数据
        2、部分是 广告数据
      """
      def get(self,request):
          #1、商品分类数据
          categories=get_category()
          #2、广告数据
          contents={}
          content_categories=ContentCategory.objects.all()
          for cat in content_categories:
              #取典对象里面内容  status=True 表示啥
              contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')
          #我们的首页 后边会进行页面静态化
          #会把数据传递 给 模板
          context={
              'categories': categories,
              'contents': contents,
          }
          # print(f"---aaaa---str---{str}")
          print("---aaaa---str---%s" % context)
          #就是themleaf模板 ，往模板中填充数据
          return render(request,'index.html', context)
          # return JsonResponse({'code': 0, 'errmsg': 'ok', 'data': context}, safe=False)
          # index= {'code': 0, 'errmsg': 'ok', 'data': context}
          # return HttpResponse(json.dumps(index), content_type='application/json')
          # return JsonResponse({
          #     'code': 0,
          #     'errmsg': 'ok',
          #     'data': {
          #         'categories': categories,
          #         'contents': contents
          #     }
          # })




"""
需求：
        根据点击的分类，来获取分类数据（有排序，有分页）
前端：
        前端会发送一个axios请求， 分类id 在路由中， 
        分页的页码（第几页数据），每页多少条数据，排序也会传递过来
后端：
    请求          接收参数
    业务逻辑       根据需求查询数据，将对象数据转换为字典数据
    响应          JSON

    路由      GET     /list/category_id/skus/
    步骤
        1.接收参数
        2.获取分类id
        3.根据分类id进行分类数据的查询验证
        4.获取面包屑数据
        5.查询分类对应的sku数据，然后排序，然后分页
        6.返回响应
"""

class ListView(View):

   def get(self,request,category_id):
       # 1、接收参数
       # 排序字段
       orderding = request.GET.get('ordering')
       #每页多少条数据
       page_size = request.GET.get('page_size')
       #要第几页数据
       page = request.GET.get('page')

       try:
           page_size = int(page_size)
       except (ValueError, TypeError) as e:
           print(f"转换 page_size 时出错: {e}")
           page_size = 10
       #2、获取分类id
       #3、根据分类id进行分类数据的查询验证
       try:
           category=GoodsCategory.objects.get(id=category_id)
       except GoodsCategory.DoesNotExist:
           return JsonResponse({'code':400,'errmsg':'参数缺失'})

       #4、获取面包屑数据
       breadcrumb=get_breadcrumb(category)
       #5、查询分类对应的sku数据 必须是上架的数据，然后排序，然后分页
       skus=SKU.objects.filter(category=category,is_launched=True).order_by(orderding)

       #object_list, per_page
       #object_list  列表数据
       #per_page     每页多少条数据
       paginator=Paginator(skus,per_page=page_size)

       #获取指定页面的数据
       page_skus=paginator.page(page)

       skus_list=[]
       #将对象转换为字典数据
       for sku in page_skus.object_list:
           skus_list.append({
               'id': sku.id,
               'name': sku.name,
               'price': sku.price,
               'default_image_url': sku.default_image.url,
           })
       #获取总页面
       total_page=paginator.num_pages

       #6、返回响应
       return JsonResponse({'code':0,'errmsg':'ok','list':skus_list,'count':total_page,'breadcrumb':breadcrumb})


########################################################################
"""
搜索 

1. 我们不使用like

2. 我们使用 全文检索
    全文检索即在指定的任意字段中进行检索查询

3. 全文检索方案需要配合搜索引擎来实现

4. 搜索引擎

    原理：  关键词与词条的对应关系，并记录词条的位置


        1  --- 我爱北京天安门                      我爱， 北京，天安门

        2 --- 王红，我爱你，我想你想的睡不着觉        王红，我爱，我爱你，睡不着觉，想你，

        3 ---  我睡不着觉                          我，睡不着觉 


        我爱


5. Elasticsearch
    进行分词操作 
    分词是指将一句话拆解成多个单字或词，这些字或词便是这句话的关键词

    下雨天 留客天 天留我不 留


6. 
    数据         <----------Haystack--------->             elasticsearch 

                        ORM(面向对象操作模型)                 mysql,oracle,sqlite,sql server
"""

"""
 我们/数据         <----------Haystack--------->             elasticsearch 

 我们是借助于 haystack 来对接 elasticsearch
 所以 haystack 可以帮助我们 查询数据
"""

class SKUSearchView(SearchView):

    def  create_response(self):
         #获取搜索的结果
         context=self.get_context()
         #添加断点来分析
         sku_list=[]
         skus=context['page'].object_list
         for sku in skus:
             print('------id---%s' % sku.object.id)
             sku_list.append({
                 'id': sku.object.id,
                 'name': sku.object.name,
                 'price': sku.object.price,
                 'default_image_url': sku.object.default_image.url,
                 'searchkey': sku.object.id,
                 'page_size': context['page'].paginator.num_pages,
                 'count': context['page'].paginator.count
             })
         return JsonResponse(sku_list, safe=False)


"""
需求：
    详情页面

    1.分类数据
    2.面包屑
    3.SKU信息
    4.规格信息


    我们的详情页面也是需要静态化实现的。
    但是我们再讲解静态化之前，应该可以先把 详情页面的数据展示出来

"""
class DetailView(View):
    def get(self,request,sku_id):
        try:
            #根据传入skuId查询详情信息 SKU信息
            sku=SKU.objects.get(id=sku_id)
        except SKU.objects:
            return JsonResponse({'code':400,'errmsg':'参数缺失'})

        #1、分类数据 sku的作用域可以到外面吗
        categorties=get_category()
        #2、面包屑
        breadcrumb=get_breadcrumb(sku.category)
        #3、规格信息
        goods_specs=get_goods_specs(sku)
        context={
            'sku':sku,
            'breadcrumb':breadcrumb,
            'specs':goods_specs,
            'categories':categorties,
        }
        return render(request,'detail.html',context)

